public class Box<T> {
private T value;
public Box(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
// 其他的方法...
在Java當中,無法使用Box,需要使用Box,這將導致,當類別需要使用到int特性的方法時,需要用以下方式寫:
public class IntBox {
private int value;
public IntBox(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
// 其他的方法...(int或Integer都可以處理的方法... + 你可能希望特定於int的方法...)
}
這樣寫的壞處在於會產生重複的程式碼(int或Integer都可以處理的方法...),並且如果我要換成實作Long的基本型別類別,又要再寫重複的程式碼。此時可以用組合的方式解決:
//用組合解決
public class IntBox {
// int或Integer都可以處理的方法
private Box<Integer> innerBox;
public IntBox(int value) {
this.innerBox = new Box<>(value);
}
public int getValue() {
return innerBox.getValue();
}
public void setValue(int value) {
innerBox.setValue(value);
}
// 你可能希望特定 於int的方法...
如此一來,我只需要實作特定於int才能使用的方法就可以了,剩餘的部分透過操作Box innerBox去處理。
Serializable:
- 任何想要被序列化的類都應該實現Serializable接口。這個接口本身並不定義任何方法,但當一個類實現了它,JVM就知道它可以被序列化。
- 已經逐漸式微,目前透過註解+實作方法就可以了。
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
// getters, setters, constructors, etc.
}
Cloneable: 如果一個類想要使用Object的clone方法複製其對象,那麼該類必須實現Cloneable接口。這是一個提示性的接口,它告訴JVM可以安全地執行某些複製操作(但還是需要自己實作複製方法,並不是實作了介面空方法就沒事了)。
public class Book implements Cloneable {
private String title;
private String author;
// Assume there are necessary methods and constructors
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
4.叛逆
5.支離破碎
// 既有的印表機
public class OldPrinter
{
public void PrintPlainText(string text)
{
Console.WriteLine(text);
}
}
// 目標接口
public interface IRichTextPrinter
{
void PrintRichText(string richText);
}
// 轉接器
public class PrinterAdapter : IRichTextPrinter
{
private OldPrinter _oldPrinter;
public PrinterAdapter(OldPrinter oldPrinter)
{
_oldPrinter = oldPrinter;
}
public void PrintRichText(string richText)
{
// 這邊假設轉換富文本為純文字的處理,實際上可能會更複雜。
string plainText = ConvertRichTextToPlainText(richText);
_oldPrinter.PrintPlainText(plainText);
}
private string ConvertRichTextToPlainText(string richText)
{
// 轉換邏輯...
return richText; // 假設返回值為純文字格式
}
}
// 使用
var oldPrinter = new OldPrinter();
var adapter = new PrinterAdapter(oldPrinter);
adapter.PrintRichText("<b>轉接器</b>模式");
6.路徑
7.循環